package myjava.j_innerClass.b_StaticInnerClass;

/**
 * @Auther: cty
 * @Date: 2020/6/25 17:30
 * @Description: 静态内部类
 * @version: 1.0
 */

/**
 * 外部类以外的类
 */
class Test{
    public static void main(String[] args) {
        // 外部类以外的地方 访问 静态内部类的静态成员
        Outer.Inner.innerStaticMethod();
        int b = Outer.Inner.innerStaticField;

        // 外部类以外的地方 访问 静态内部类的实例成员
        Outer.Inner inner = new Outer.Inner();
        inner.innerInstanceMethod();
        int a = inner.innerInstanceField;
    }
}

/**
 * 外部类
 */
class Outer {
    private int outerInstanceField;
    private static int outerStaticField;

    public void outerInstanceMethod(){
        // 外部类实例成员中 访问 静态内部类的静态成员
        Inner.innerStaticMethod();
        int a = Inner.innerStaticField;

        // 外部类实例成员中 访问 静态内部类的实例成员
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    public static void outerStaticMethod(){
        // 外部类静态成员中 访问 静态内部类的静态成员
        Inner.innerStaticMethod();
        int a = Inner.innerStaticField;

        // 外部类静态成员中 访问 静态内部类的实例成员
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    /**
     * 静态内部类
     */
    public static class Inner {
        public int innerInstanceField;
        public static int innerStaticField;

        public void innerInstanceMethod(){
            // 静态内部类实例成员中 访问 外部类静态成员
            outerStaticMethod();
            int a = outerStaticField;

            // 静态内部类实例成员中 访问 外部类实例成员
            Outer outer = new Outer();
            outer.outerInstanceMethod();
            int b = outer.outerInstanceField;
        }

        public static void innerStaticMethod(){
            // 静态内部类静态成员中 访问 外部类静态成员
            outerStaticMethod();
            int a = outerStaticField;

            // 静态内部类静态成员中 访问 外部类实例成员
            Outer outer = new Outer();
            outer.outerInstanceMethod();
            int b = outer.outerInstanceField;
        }
    }  // end Inner{}

}  // end Outer{}
